package cn.zyq.ykb.service.product;

import cn.zyq.ykb.beans.pay.PayOrder;
import cn.zyq.ykb.beans.product.Product;
import cn.zyq.ykb.beans.product.ProductOrder;
import cn.zyq.ykb.beans.user.User;
import cn.zyq.ykb.system.common.PageParam;
import com.github.pagehelper.PageInfo;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 商品订单Service接口
 *
 * @author SystemAuth
 * @date 2023-11-02
 */
public interface ProductOrderService {
    /**
     * 查询商品订单
     *
     * @param productOrderID 商品订单主键
     * @return 商品订单
     */
    ProductOrder selectProductOrderByProductOrderID(Integer productOrderID);

    /**
     * 查询商品订单
     *
     * @param serviceID 商品订单业务ID
     * @return 商品订单
     */
    ProductOrder selectProductOrderByServiceID(String serviceID);

    /**
     * 查询商品订单列表
     *
     * @param pageParam
     * @param user
     * @return 商品订单集合
     */
    PageInfo<ProductOrder> selectProductOrderList(PageParam pageParam,User user);

    PageInfo<ProductOrder> selectProductOrderListGL(PageParam pageParam);
    /**
     * 查询商品订单列表
     *
     * @param pageParam
     * @return 商品订单集合
     */
    List<ProductOrder> selectProductOrderAllList(PageParam pageParam);

    /**
     * 新增商品订单
     *
     * @param param 商品订单
     * @return 结果
     */
    int insertProductOrder(ProductOrder param);

    /**
     * 修改商品订单
     *
     * @param param 商品订单
     * @return 结果
     */
    int updateProductOrder(ProductOrder param);

    /**
     * 批量删除商品订单
     *
     * @param productOrderIDs 需要删除的商品订单主键集合
     * @return 结果
     */
    int deleteProductOrderByProductOrderIDs(Integer[] productOrderIDs);

    /**
     * 删除商品订单信息
     *
     * @param productOrderID 商品订单主键
     * @return 结果
     */
    int deleteProductOrderByProductOrderID(Integer productOrderID);

    /**
     * 商品下单
     * @param product
     * @param request
     * @param loginUser
     * @return
     */
    ProductOrder placeOrder(Product product, HttpServletRequest request, User loginUser);

    /**
     * 支付回调
     *
     * @param payOrder
     */
    void payNotifyOrder(PayOrder payOrder);

    void reloadStateQueue();
}
